package com.fuyun.rpc.client.config;

import com.fuyun.rpc.client.registry.Registry;
import com.fuyun.rpc.client.registry.RegistryFactory;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * @author: zrq1351
 * @date: 2025/2/14
 */
@Slf4j
@Data
public class RpcApplication {

	private RpcConfig rpcConfig;

	private RegistryConfig registryConfig;

	public RpcApplication() {

	}

	public RpcApplication(RpcConfig rpcConfig, RegistryConfig registryConfig) {
		this.rpcConfig = rpcConfig;
		this.registryConfig = registryConfig;
	}

	/**
	 * 初始化RPC框架 该方法尝试根据配置信息初始化RPC框架的注册中心 主要步骤包括： 1. 根据rpcConfig配置获取注册中心的实例 2. 打印初始化日志，记录当前的rpc配置和注册中心配置 3.
	 * 调用注册中心的初始化方法，并传入注册中心的配置 4. 打印注册中心初始化成功的日志 如果在初始化过程中发生异常，则记录错误日志
	 */
	public void init() {
		try {
			Registry registry = RegistryFactory.getInstance(rpcConfig.getRegistry());
			log.info("fuyun-rpc初始化, rpcConfig = {}, registryConfig = {}", rpcConfig, registryConfig);
			registry.init(registryConfig);
			log.info("registry init, registry = {}, registryConfig = {}", registry, registryConfig);
		} catch (Exception e) {
			log.error("rpc init error", e);
		}
	}

	/**
	 * 深拷贝
	 */
	public RpcApplication deepCopy() {
		RpcApplication rpcApplication = new RpcApplication();
		rpcApplication.setRpcConfig(rpcConfig.deepCopy());
		rpcApplication.setRegistryConfig(registryConfig.deepCopy());
		return rpcApplication;
	}
}